﻿// 505 区间筛.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;
/*

http://oj.daimayuan.top/course/21/problem/521


给两个数字l,r，求l∼r中的所有素数p。

为了防止输出过大和防止打表，给定a,b
，输出这些素数(a⋅p+b)mod2^32的异或和。

输入格式
第一行四个整数l,r,a,b。

输出格式
一个整数，表示答案。

样例输入
1 100 1 0
样例输出
64
数据规模
对于所有数据，保证1≤l≤r≤10^14,0≤a,b<2^32,r−l≤10^7。
*/


long long l, r, a, b;
const int N = 10000010;
long long primes[N], cnt;     // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉

void get_primes(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] <= n / i; j++)
        {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

int table[N];

int main()
{
	cin >> l >> r >> a >> b;
    get_primes(sqrt(r) + 1);
   
    for (int i = 0; i < cnt; i++) {
        long long pv = primes[i];
        long long st = max(l + pv - (l % pv), 2 * pv);
        if (l % pv == 0) st = l;
        for (long long j = st; j <= r; j += pv) {
            table[j - l] = 1;
        }
    }
    if (l == 1) table[0] = 1;
    long long ans = 0;
    for (int i = 0; i < r - l + 1; i++) {
        if (table[i] != 1) {
            long long v = i + l;
            ans ^= (unsigned int )(a * v + b);
            ans = (unsigned int)ans;
        }
    }

    cout << ans << endl;
	return 0;
}
 